package com.chenfan.magic.core;

import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 多数据源处理类, 数据驱动核心
 *
 * @author 周夕
 * @date 2019-09-19 17:03
 */
@Slf4j
public class M {

    /**
     * 初始化默认数据源->怼入jdbcTemplate
     *
     * @param dataSource 这个值，如果是直接 new DataSourceModel(),则传入当前的系统数据源，如果重新set一遍就是新设置的数据源
     * @return
     */
    public static I init(DruidDataSource dataSource) {
        return new I(dataSource);
    }

    /**
     * 初始化默认数据源 -> 使用自定义脚本,可以在这里放进去也可以在调用内层方法的时候再传递进去
     *
     * @param dataSource
     * @param scripts
     * @return
     */
    public static I init(DruidDataSource dataSource, String scripts) {
        I i = new I(dataSource);
        i.setScript(scripts);
        return i;
    }

    //////////////////////////////////////////////////

    /**
     * 调用Druid内置接口加密数据库密码,为之生成私匙(用于生成密文密码),公匙(用于解密密码)以及加密后的密码
     *
     * @param password
     * @return
     */
    public static Map<String, String> encryptDbPassword(String password) {
        Map<String, String> encryptPasw = Maps.newHashMap();
        encryptPasw.put("password", password);
        try {
            String[] arr = ConfigTools.genKeyPair(512);
            encryptPasw.put("privateKey", arr[0]);
            encryptPasw.put("publicKey", arr[1]);
            encryptPasw.put("password", ConfigTools.encrypt(arr[0], password));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("数据库密码加密失败!");
        }
        return encryptPasw;
    }

    public static String decryptDbPassword(String publickey, String password) {
        try {
            return ConfigTools.decrypt(publickey, password);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("数据库密码解密失败!");
        }
        return password;
    }
}
